package com.sdry.service.zc;

import java.util.List;

import com.sdry.model.barCodeOperation.BarCodeOperation;
import com.sdry.model.jyy.TrayLocation;
import com.sdry.model.lz.CodeMark;
import com.sdry.model.lz.Materiel;
import com.sdry.model.lz.WarehouseRegion;
import com.sdry.model.lz.WarehouseRegionLocation;
import com.sdry.model.zc.ZcMaterielAndTrayEntity;
import com.sdry.model.zc.ZcMaterileMoveInfoEntity;
import com.sdry.model.zc.ZcTrayAndLocationEntity;

/**
 * 物料与托盘的绑定与解绑
 * @ClassName:    ZcBindAndUnbindService   
 * @Description:  
 * 1、多仓库修改  t  2019-11-01  
 * 100-109：修改根据条码+","查询库区编号加条件仓库id     
 * 2、多仓库修改  t  2019-11-04 
 * 33-47：修改根据条码+","查询物料信息加条件仓库id
 * 111-125	扫码查询物料位置（下架2）加条件仓库id
 * 3、多仓库修改  t  2019-11-05 
 * 83-96	区域库存的移动加参数仓库id
 * 97-111	扫码查询物料位置（下架）加条件仓库id
 * 150-164	根据库位码和仓库id查询在良品区的条数
 * 165-179    	根据库位码和仓库id查询在不良品区的条数
 * 213-227	通过物料条码和仓库id查询物料所在位置 以托盘为主
 * @Author:       zc   
 * @CreateDate:   2019年6月3日 上午10:34:55   
 * @Version:      v1.0
 */
public interface ZcBindAndUnbindService {

	/* ******************************多仓库修改  t  2019-11-04 开始*************************** */
	/**
	 * 根据条码+","、仓库查询物料信息
	 * @param materiel_code 条码 +","
	 * @param warehouse_id 仓库id
	 * @return 库区编码
	 */
	public Materiel selectMaterielInfoByCode(String materiel_code,Long warehouse_id);
	/** 多仓库修改之前：
	 * 通过物料条码查询物料信息
	 * @param materiel_code
	 * @return
	 */
	//多仓库修改之前：public Materiel selectMaterielInfoByCode(String materiel_code);
	/* ******************************多仓库修改  t  2019-11-04 结束*************************** */
	/**
	 * 绑定
	 * @param zcMaterielAndTrayEntity
	 * @return
	 */
	public int bindingAndUp(ZcMaterielAndTrayEntity zcMaterielAndTrayEntity);

	/**
	 * 通过物料条码查询物料所在位置
	 * @param materiel_code
	 * @return
	 */
	public ZcMaterielAndTrayEntity selectMaterielLocationByCode(String materiel_code);
	/**
	 * 解绑
	 * @param zcMaterielAndTrayEntity
	 * @return
	 */
	public int downAndUnbind(ZcMaterielAndTrayEntity zcMaterielAndTrayEntity);
	/**
	 * 条件查询库位信息
	 * @param materiel
	 */
	public List<WarehouseRegionLocation> selectTopLocation(Materiel materiel);
	/**
	 * 查询全部库区
	 * @param warehouse_id 
	 * @return
	 */
	public List<WarehouseRegion> selectAllRegion(Long warehouse_id);
	/**
	 * 下架推荐库位
	 * @return
	 */
	public String selectTopLocationDown(String materiel_num);
	/* ******************************多仓库修改  t  2019-11-05 开始*************************** */
	/**
	 * 区域库存的移动
	 * @param zcMaterielAndTrayEntity
	 * @return
	 */
	public int bindAndUp2SpecialArea(ZcMaterielAndTrayEntity zcMaterielAndTrayEntity,Long warehouse_id);
	/** //多仓库修改之前：
	 * 区域库存的移动
	 * @param zcMaterielAndTrayEntity
	 * @return
	 *//*
	public int bindAndUp2SpecialArea(ZcMaterielAndTrayEntity zcMaterielAndTrayEntity);*/
	/* ******************************多仓库修改  t  2019-11-05 结束*************************** */
	/* ******************************多仓库修改  t  2019-11-05 开始*************************** */
	/**
	 * 扫码查询物料位置（下架）
	 * @param materiel_code 物料条码
	 * @param warehouse_id 仓库id
	 * @return
	 */
	public ZcMaterielAndTrayEntity selectMaterielLocationByCodeDown(String materiel_code,Long warehouse_id);
	/** //多仓库修改之前：
	 * 扫码查询物料位置（下架）
	 * @param materiel_code
	 * @return
	 *//*
	public ZcMaterielAndTrayEntity selectMaterielLocationByCodeDown(String materiel_code);*/
	/* ******************************多仓库修改  t  2019-11-05 结束*************************** */
	/* ******************************多仓库修改  t  2019-11-04 开始*************************** */
	/**
	 * 扫码查询物料位置（下架2）
	 * @param materiel_code 条码
	 * @param warehouse_id 仓库id
	 * @return
	 */
	public ZcMaterielAndTrayEntity selectMaterielLocationByCodeDown1(String materiel_code,Long warehouse_id);
	/** //多仓库修改之前：
	 * 扫码查询物料位置（下架2）
	 * @param materiel_code
	 * @return
	 */
	//多仓库修改之前：public ZcMaterielAndTrayEntity selectMaterielLocationByCodeDown1(String materiel_code);
	/* ******************************多仓库修改  t  2019-11-04 结束*************************** */
	/**
	 * 通过物料条码查询物料是否在对应位置
	 * @param materiel_code
	 * @param location_code 库区编号
	 * @return
	 */
	public ZcMaterielAndTrayEntity selectMaterielLocationByCodeDownLocation(String materiel_code,String location_code);
	/* ******************************多仓库修改  t  2019-11-01 开始*************************** */
	/**
	 * 根据条码+","、仓库id查询库区编号
	 * @param materiel_code 条码 +","
	 * @param warehouse_id 仓库id
	 * @return 库区编码
	 */
	public String selectByMaterielCode(String materiel_code,Long warehouse_id);
	//多仓库修改之前：public String selectByMaterielCode(String materiel_code);
	/* ******************************多仓库修改  t  2019-11-01 结束*************************** */
	/**
	 * 根据精准码查询库位集合
	 * @param code
	 * @return
	 */
	public List<WarehouseRegionLocation> queryLocationByCode(String code);
	/* ******************************多仓库修改  t  2019-11-05 开始*************************** */
	/**
	 * 根据库位码和仓库id查询在良品区的条数
	 * @param location_code 库位码
	 * @param warehouse_id 仓库id
	 * @return
	 */
	public int selectCountGoodByLocationCode(String location_code,Long warehouse_id);
	/** //多仓库修改之前：
	 * 查询库位码是否在良品区
	 * @param location_code
	 * @return
	 *//*
	public int selectCountGoodByLocationCode(String location_code);*/
	/* ******************************多仓库修改  t  2019-11-05 结束*************************** */
	/* ******************************多仓库修改  t  2019-11-05 开始*************************** */
	/**
	 * 根据库位码和仓库id查询在不良品区的条数
	 * @param location_code 库位码
	 * @param warehouse_id 仓库id
	 * @return
	 */
	public int selectCountBadByLocationCode(String location_code,Long warehouse_id);
	/** //多仓库修改之前：
	 * 查询库位码是否在不良品区
	 * @param location_code
	 * @return
	 *//*
	public int selectCountBadByLocationCode(String location_code);*/
	/* ******************************多仓库修改  t  2019-11-05 结束*************************** */
	/**   
	 * 绑定物料托盘  
	 * @param zcMaterielAndTrayEntity             
	 */
	public void addMaterielAndTray(ZcMaterielAndTrayEntity zcMaterielAndTrayEntity);
	/**   
	 * 根据库位查询
	 * @param a
	 * @return             
	 */
	public ZcTrayAndLocationEntity selectTrayCodeByLocationCode(ZcTrayAndLocationEntity a);
	/**   
	 * 库位托盘绑定   
	 * @param newLocation             
	 */
	public void addTrayAndLocation(ZcMaterielAndTrayEntity newLocation);
	/**
	 * 缓冲区添加数据
	 * @param zcMaterileMoveInfoEntity
	 * @return
	 */
	Integer inCache(ZcMaterileMoveInfoEntity zcMaterileMoveInfoEntity);
	/**
	 * 从良品库出库
	 * @param zcMaterileMoveInfoEntity
	 * @return
	 */
	public int outGood(ZcMaterileMoveInfoEntity zcMaterileMoveInfoEntity);
	/**     
	 * 记录下架记录
	 * @param zcMaterielAndTrayEntity
	 */
	void insertUnbindleRecord(ZcMaterielAndTrayEntity zcMaterielAndTrayEntity);
	/* ******************************多仓库修改  t  2019-11-05 开始*************************** */
	/** 多仓库修改之前：
	 * 通过物料条码查询物料所在位置 以托盘为主
	 * @param materiel_code
	 * @return
	 *//*
	public ZcMaterielAndTrayEntity selectMaterielTrayLocationByCode(String materiel_code);*/
	/**
	 * 通过物料条码和仓库id查询物料所在位置 以托盘为主
	 * @param materiel_code    物料条码
	 * @param warehouse_id     仓库id
	 * @return
	 */
	public ZcMaterielAndTrayEntity selectMaterielTrayLocationByCode(String materiel_code,Long warehouse_id);

    List<WarehouseRegionLocation> getRegionDetailByRegionId(Long regionId);

	/**
	 * 点击库位详细信息
	 * @param location_num 库位
	 * @return
	 */
    WarehouseRegionLocation getRegionDetail(String location_num);

	/**
	 * 库位下的条码物料
	 * @param location_num
	 * @return
	 */
	List<Materiel> getMaterielList(String location_num);
	/* ******************************多仓库修改  t  2019-11-05 结束*************************** */
	
	/**
	 * 根据条码查询此条码的托盘库位等信息
	 * @author jyy
	 * @param materiel_code 条码
	 * @return 托盘库位联合实体集合
	 */
	public List<TrayLocation> selectInfoByCode(String materiel_code);
	
	/**
	 * 查询推荐库位
	 * @author jyy
	 * @param region_id 库区id
	 * @return 推荐库位
	 */
	public String selectTopOneLocation(Long region_id);
	
	/**
	 * 根据物料id,仓库id,批次，是否良品4个字段查询同批剩余
	 * @author jyy
	 * @param trayLocation 查询实体
	 * @return 同批剩余总数
	 */
	public int selectOtherCommon(TrayLocation trayLocation);
	
	/**
	 * 根据仓库id和库位编号查询库位是否存在，以及是良品区的库位还是不良品区的库位
	 * @author jyy
	 * @param warehouse_id 仓库id
	 * @param location 库位编号
	 * @return 返回库区名称
	 */
	public String selectLocationExist(String warehouse_id, String location);
	
	/**
	 * 整托上架
	 * @author jyy
	 * @param materiel_code 物料条码
	 * @param mid 物料id
	 * @param mbatch 物料批次
	 * @param targetLocation 目标库位
	 * @param binding_person 操作人
	 * @param warehouse_id 仓库id
	 * @return  返回状态值
	 */
	public int wholeUp(String materiel_code, Long mid, String mbatch, String targetLocation, Long binding_person, Long warehouse_id);
	
	/**
	 * 部分上架
	 * @author jyy
	 * @param materiel_code 物料条码
	 * @param mid 物料id
	 * @param mbatch 物料批次
	 * @param targetLocation 目标库位
	 * @param binding_person 操作人
	 * @param warehouse_id 仓库id
	 * @param delete_code 不上架的条码
	 * @return 返回状态值
	 */
	public int partUp(String materiel_code, Long mid, String mbatch, String targetLocation, Long binding_person, Long warehouse_id, String delete_code);
	
	/**
	 * 根据条码查询条码数量
	 * @author jyy
	 * @param s 条码
	 * @return 数量
	 */
	public Integer queryCodeMarkByCode(String s);
	
	/**
	 * 整个库位下架
	 * @author jyy
	 * @param location_code 库位码
	 * @param binding_person 操作人
	 * @param warehouse_id 仓库
	 */
	public int wholeDown(String location_code, Long binding_person, Long warehouse_id);
	
	/**
	 * 部分下架
	 * @param materiel_code 条码字符串
	 * @param codeNum 条码数量
	 * @param trayLocation 条码其他信息
	 * @param binding_person 操作人
	 */
	public int partDown(String materiel_code, Integer codeNum, TrayLocation trayLocation, Long binding_person);
	
	/**
	 * 根据库位查询此库位的所有条码
	 * @param location_code 库位
	 * @param warehouse_id 仓库id
	 * @return 条码信息集合
	 */
	public List<BarCodeOperation> selectAllCodeByLocation(String location_code, Long warehouse_id);
	
	/**
	 * 删除所有没用的托盘，和空托盘，空库位
	 */
	public void deleteTrayAndLocation();
	
	/**
	 * 根据物料SAP查询物料所在位置及数量
	 * @param number 物料SAP
	 * @param warehouse_id 仓库id
	 * @return 集合
	 */
	public List<TrayLocation> selectLocationAndNum(String number, Long warehouse_id);
	
	/**
	 * 根据物料id 和  库位码 查询条码信息
	 * @param mid 物料id
	 * @param location_code 库位
	 * @param warehouse_id 仓库id
	 * @return 条码信息集合
	 */
	public List<CodeMark> selectCodeInfoByLocationAndMa(Long mid, String location_code, Long warehouse_id);
}
